package main

/*
* Content: big包、精密运算、字符串转大数、浮点型大数
* --------------------------------------------------
* Go 语言—big 包的使用: https://xie.infoq.cn/article/ea57b281373e825153f366f8f
 */

import (
	"fmt"
	"math"
	"math/big"
)

func MyBagBig() {

	// big包
	fmt.Println("--------------------big包--------------------")

	// 创建整形大数
	myBig := big.NewInt(math.MaxInt64)
	fmt.Printf("创建出来的大数是: %v\n", myBig)

	// 精密运算
	fmt.Println("--------------------精密运算--------------------")

	// 加法
	big1 := big.NewInt(math.MaxInt64)
	big2 := big.NewInt(math.MaxInt64)
	big3 := big1.Add(big1, big2)
	fmt.Printf("加法运算 big1.Add() 结果: %v\n", big3)

	// 减法
	big1 = big.NewInt(math.MaxInt64)
	big2 = big.NewInt(math.MaxInt64)
	big4 := big1.Sub(big1, big2)
	fmt.Printf("减法运算 big1.Sub() 结果: %v\n", big4)

	// 乘法
	big1 = big.NewInt(math.MaxInt64)
	big5 := big1.Mul(big1, big.NewInt(3))
	fmt.Printf("乘法运算 big1.Mul() 结果: %v\n", big5)

	// 除法
	big1 = big.NewInt(math.MaxInt64)
	big6 := big1.Div(big1, big.NewInt(8))
	fmt.Printf("除法运算 big1.Div() 结果: %v\n", big6)

	// 字符串转大数
	fmt.Println("--------------------字符串转大数--------------------")

	big10 := big.NewInt(1)
	// 10: 十进制: 0 或者 2 到 MaxBase（字符串转换函数接受的最大进制） 之间的整数
	_, ok := big10.SetString("22222222222222222222222222222", 10)
	if !ok {
		fmt.Println("设置失败")
	}

	fmt.Printf("字符串设置的大数为: %v\n", big10)

	big10.Div(big10, big.NewInt(2))
	fmt.Printf("字符串设置的大数 除以2 之后为: %v\n", big10)

	// 浮点型大数
	fmt.Println("--------------------浮点型大数--------------------")
	// 浮点型的使用方法同整形一样，唯一有区别的是除法计算不一样，在浮点型中除法计算使用的是 Quo() 方法

	// 除法: 在浮点型大数计算中, 只有 除法函数 与整数计算不同
	float1 := big.NewFloat(math.MaxFloat64)
	float2 := float1.Quo(float1, big.NewFloat(2))
	fmt.Printf("浮点型除法运算 float1.Quo 结果: %v\n", float2)

}
